#include <iostream>
#include <string>

#include <cstdlib>
#include <cstdio>
#include <cstring>

#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>


#define NUM 1024
#define N 2

using namespace std;

//child
void Write(int wfd)
{
    string s="hello, I am child";
    pid_t self=getpid();
    int number=0;

    char buffer[NUM];
    while(true)
    {
        sleep(1);
        //构建发送字符串
        // buffer[0]=0;//字符串清空，只是为了提醒阅读代码的人，我把这个数组当作字符串了
        // snprintf(buffer,sizeof(buffer),"%s-%d-%d",s.c_str(),self,number++);
        // cout<<buffer<<endl;
        //发送/写入给父进程
        // write(wfd,buffer,strlen(buffer));
        char c='c';
        write(wfd,&c,1);
        number++;
        cout<<number<<endl;
        // sleep(1);
    }
}

//father
void Read(int rfd)
{
    char buffer[NUM];

    while(true)
    {
        int cnt=0;
        sleep(1);
        buffer[0]=0;
        //system call
        ssize_t n=read(rfd,buffer,sizeof(buffer)); //sizeof != strlen
        if(n>0)
        {
            buffer[n] = 0;  // 0 == '\0'
            cout<<"father get a message["<<getpid()<<"]#"<<buffer<<endl;
        }
        else if(n==0)
        {
            cout<<"father read file done"<<endl;
            break;
        }
        else break;

        cnt++;
        if(cnt>5) break;
    }
}


int main()
{
    int pipefd[N]={0};
    int n=pipe(pipefd);
    if(n<0) return 1;

    // cout<<"pipefd[0]:"<<pipefd[0]<<",pipefd[1]:"<<pipefd[1]<<endl;

    //child -> w,parent -> r;
    pid_t id=fork();
    if(id<0) return 2;
    if(id==0)
    {
        //child
        close(pipefd[0]);
        //IPC code
        Write(pipefd[1]);


        close(pipefd[1]);
        exit(0);
    }
    //father
    close(pipefd[1]);

    //IPC code
    Read(pipefd[0]);//读取五秒
    close(pipefd[0]);
    cout<<"father close read fd:"<<pipefd[0]<<endl;
    sleep(5);//为了观察僵尸

    int status=0;
    pid_t rid=waitpid(id,&status,0);
    if(rid<0) return 3;

    cout<<"wait child success:"<<rid<<"exit code:"<<
    ((status>>8)&0xFF)<<"exit signal:"<<(status&0x7F)<<endl;


    sleep(5);
    cout<<"father quit"<<endl;
    return 0;
}
